package projectsys.sys.core.utils;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import projectsys.sys.core.model.Module;
import projectsys.sys.core.model.Role;
import projectsys.sys.core.model.User;
import projectsys.sys.core.service.ModuleManager;

/**
 * 
 * @ClassName:模块权限树管理 (ModuleTreeUtil.java)
 * 
 * @Description:
 * 
 * @Date: 2011-12-15 上午10:14:43
 * @Author zhangwc
 * @Version 1.0
 */
public final class ModuleTreeUtil {

	ModuleManager moduleManager = (ModuleManager) ServiceLocator.getInstance()
			.getService(ModuleManager.class);

	private static Logger logger = Logger.getLogger(ModuleTreeUtil.class);

	private static ModuleTreeUtil instance = new ModuleTreeUtil();

	public static ModuleTreeUtil getInstance() {
		return instance;
	}

	List<Module> moduleList = new ArrayList<Module>(); // 存储所有角色对应的所有权限

	private ModuleTreeUtil() {
		logger.info("模块权限初始化中...");

		moduleList = this.moduleManager.getModuleTrees();

		logger.info("模块权限加入缓存结束...");
	}

	/**
	 * 
	 * @Description: 根据站点获取该站点下模块 超级管理员不受模块限制
	 * 
	 * @Date: 2012-3-20 下午01:49:40
	 * @Author zhangwc
	 */
	public List<Module> getModulesByMid(List<Role> roles, List<String> umids,
			User user) {

		List<Module> moduleListByUser = new ArrayList<Module>();
		boolean bool = false;
		for (Role role : roles) {
			if ("10000000000000000".equals(role.getMid())) { //判断该用户角色是否有在模块根节点下
				bool = true;
			}
		}

		for (Module module : moduleList) {
			if (bool) {   //如果是 直接返回整个模块树
				return moduleList;   
			} else { 	  //如果不是则返回该用户有的权限
				if (umids.contains(module.getId())) {
					moduleListByUser.add(module);
				}
			}
		}
		return moduleListByUser;
	}
	
	/**
	 * 根据站点获取该站点下模块 
	 * @author qdz
	 * @createDate 2019年7月3日 下午4:53:27
	 * @updateDate 2019年7月3日 下午4:53:27
	 * @version 1.0
	 * @param roles
	 * @param umids
	 * @return
	 */
	public List<Module> getModulesByMid(List<Role> roles, List<String> umids) {

		List<Module> moduleListByUser = new ArrayList<Module>();

		for (Module module : moduleList) {
			if (umids.contains(module.getId())) {
				moduleListByUser.add(module);
			}
		}
		return moduleListByUser;
	}
	
	public void refreshModules(Module module,String type){
		if(StringUtils.isNotBlank(type)){
			if("delete".equals(type)){
				removeModule(module);
			}else if("add".equals(type)){
				moduleList.add(module);
			}else if("update".equals(type)){ //如果是更新则先删除原模块在添加新模块
			/*	Module oldM=this.moduleManager.getModulebyId(module.getId());
				moduleList.remove(oldM);
				moduleList.add(module);*/
				removeModule(module);
				moduleList.add(module);
				
			}
			
		}
		
	}

	private void removeModule(Module module) {
		for (Module m : moduleList) {
			if (m.getId().contains(module.getId())) {
				moduleList.remove(m);
				break;
			}
		}
	}
}
